home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 001-010 / amok06 / listall / listall.mod < prev    next >
Text File  |  1993-11-04  |  6KB  |  216 lines

  1. (**********************************************************************
  2.  
  3.     :Program.       ListAll.mod
  4.     :Author.        Nicolas Benezan
  5.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  6.     :Phone.      0711/333679
  7.     :shortcut.      [bne]
  8.     :Version.       1.0b   
  9.     :Date.          07.06.88
  10.     :Copyright.  PD
  11.     :Language.      Modula-II
  12.     :Translator. M2Amiga AMSoft
  13.     :Imports.     
  14.     :UpDate.     
  15.     :Contents.     CLI Command "List opt a"
  16.     :Remark.    
  17.     
  18. **********************************************************************)
  19.  
  20. MODULE ListAll;
  21.  
  22. FROM Dos    IMPORT FileLockPtr,sharedLock,Lock,UnLock,Examine,ctrlC,
  23.         ExNext,IoErr,FileInfoBlock,FileInfoBlockPtr,CurrentDir,
  24.                 Open,FileHandlePtr,Close,Write,Output,newFile,WaitForChar;
  25. FROM Arts    IMPORT returnVal,wbStarted;
  26. FROM Storage    IMPORT ALLOCATE,DEALLOCATE;
  27. FROM SYSTEM    IMPORT ADR,ADDRESS,LONGSET;
  28. FROM Arguments    IMPORT GetLock,NumArgs,GetArg;
  29. FROM Exec    IMPORT SetSignal,SetExcept;
  30. FROM ASCII    IMPORT lf,cr,sp,nul;
  31. FROM Conversions IMPORT ValToStr;
  32.  
  33. CONST    Leer="                                                                ";
  34.     TimeOut=20*1000000;
  35. VAR    OldDir,Dir:FileLockPtr;
  36.     Info:FileInfoBlockPtr;
  37.         DummyF,DummyB:LONGINT;
  38.         DummyL:INTEGER;
  39.         Out:FileHandlePtr;
  40.         Arg,Str:ARRAY [0..30] OF CHAR;
  41.         st:LONGINT;
  42.         Quick,Usage:BOOLEAN;
  43.  
  44. PROCEDURE SetTab(Tab:INTEGER);
  45. BEGIN
  46.   IF Tab>0 THEN
  47.     IF Tab>64 THEN
  48.       Tab:=64;
  49.     END;
  50.     st:=Write(Out,ADR(Leer),Tab);
  51.   END;
  52. END SetTab;
  53.  
  54. PROCEDURE WriteChar(Ch:CHAR);
  55. BEGIN
  56.   st:=Write(Out,ADR(Ch),1);
  57. END WriteChar;
  58.  
  59. PROCEDURE WriteInt(Val:LONGINT;Digits:INTEGER);
  60. VAR    err:BOOLEAN;
  61. BEGIN
  62.   ValToStr(Val,TRUE,Str,10,Digits,sp,err);
  63.   st:=Write(Out,ADR(Str),ABS(Digits));
  64. END WriteInt;
  65.  
  66. PROCEDURE Len(VAR Str:ARRAY OF CHAR):INTEGER;
  67. VAR    Count:INTEGER;
  68. BEGIN
  69.   Count:=0;
  70.   WHILE (Count<HIGH(Str))AND(Str[Count]#nul) DO
  71.     INC(Count);
  72.   END;
  73.   RETURN Count;
  74. END Len;
  75.  
  76. PROCEDURE WriteString(Str:ADDRESS);
  77. VAR    StringPtr:POINTER TO ARRAY [0..30] OF CHAR;
  78. BEGIN
  79.   StringPtr:=Str;
  80.   st:=Write(Out,Str,Len(StringPtr^));
  81. END WriteString;
  82.  
  83. PROCEDURE WriteForm(Str:ADDRESS;Width:INTEGER);
  84. VAR    StringPtr:POINTER TO ARRAY [0..30] OF CHAR;
  85.     Pos:INTEGER;
  86. BEGIN
  87.   StringPtr:=Str;
  88.   Pos:=Len(StringPtr^);
  89.   st:=Write(Out,Str,Pos);
  90.   IF Pos<Width THEN
  91.     st:=Write(Out,ADR(Leer),Width-Pos);
  92.   END;
  93. END WriteForm;
  94.  
  95. PROCEDURE WriteLn;
  96. CONST    ceol=CARDINAL(ORD(lf)+256*ORD(cr));
  97. VAR    eol:CARDINAL;
  98. BEGIN
  99.   eol:=ceol;
  100.   st:=Write(Out,ADR(eol),2);
  101. END WriteLn;
  102.  
  103. PROCEDURE DispDir(DirLock:FileLockPtr;Tab:INTEGER;VAR Files,Bytes:
  104.         LONGINT);
  105. VAR    ParLock:FileLockPtr;
  106.     Info:FileInfoBlockPtr;
  107.         Status,SubFiles,OwnFiles,SubBytes,OwnBytes:LONGINT;
  108. BEGIN
  109.   OwnFiles:=0;
  110.   OwnBytes:=0;
  111.   Files:=0;
  112.   Bytes:=0;
  113.   ALLOCATE(Info,SIZE(FileInfoBlock));
  114.   IF Info#NIL THEN
  115.     IF (DirLock#NIL)AND(Examine(DirLock,Info)#0) THEN
  116.       IF NOT Quick THEN
  117.         SetTab(Tab);
  118.         WriteString(ADR(Info^.fileName));
  119.         WriteString(ADR(" (dir):"));
  120.         WriteLn;
  121.       END;
  122.       REPEAT
  123.         Status:=ExNext(DirLock,Info);
  124.         IF Status#0 THEN
  125.           IF Info^.entryType<0 THEN
  126.             INC(OwnFiles);
  127.             INC(OwnBytes,Info^.size);
  128.             IF NOT Quick THEN
  129.               SetTab(Tab+2);
  130.               WriteForm(ADR(Info^.fileName),30);
  131.               WriteInt(Info^.size,7);
  132.               WriteLn;
  133.             END;
  134.           ELSE
  135.             IF CurrentDir(DirLock)#NIL THEN END;
  136.             ParLock:=Lock(ADR(Info^.fileName),sharedLock);
  137.             DispDir(ParLock,Tab+2,SubFiles,SubBytes);
  138.             INC(Files,SubFiles);
  139.             INC(Bytes,SubBytes);
  140.             UnLock(ParLock);
  141.           END;
  142.         END;
  143.         IF ctrlC IN SetSignal(LONGSET{},LONGSET{}) THEN
  144.           RETURN;
  145.         END;
  146.       UNTIL Status=0;
  147.       INC(Files,OwnFiles);
  148.       INC(Bytes,OwnBytes);
  149.       SetTab(Tab);
  150.       IF Examine(DirLock,Info)#0 THEN
  151.         WriteString(ADR(Info^.fileName));
  152.         WriteChar(":");
  153.       END;
  154.       WriteInt(OwnBytes,-7);
  155.       WriteChar("/");
  156.       WriteInt(OwnFiles,-7);
  157.       WriteString(ADR("  All:"));
  158.       WriteInt(Bytes,-7);
  159.       WriteChar("/");
  160.       WriteInt(Files,-7);
  161.       WriteLn;
  162.     END;
  163.     DEALLOCATE(Info,SIZE(FileInfoBlock));
  164.   END;
  165. END DispDir;
  166.  
  167. BEGIN
  168.   IF ctrlC IN SetExcept(LONGSET{},LONGSET{ctrlC}) THEN END;
  169.   ALLOCATE(Info,SIZE(FileInfoBlock));
  170.   IF Info#NIL THEN
  171.     IF wbStarted THEN
  172.       Dir:=GetLock(NumArgs());
  173.       Out:=Open(ADR("CON:0/50/550/100/ListAll V1.0"),newFile);
  174.       Quick:=TRUE;
  175.       Usage:=FALSE;
  176.     ELSE
  177.       Out:=Output();
  178.       OldDir:=CurrentDir(NIL);
  179.       GetArg(NumArgs(),Arg,DummyL);
  180.       Quick:=((Arg[0]="q")OR(Arg[0]="Q"))AND(DummyL=1);
  181.       IF (NumArgs()>1) OR ((NumArgs()>0)AND(NOT Quick)) THEN
  182.         GetArg(1,Arg,DummyL);
  183.         Dir:=CurrentDir(OldDir);
  184.         Dir:=Lock(ADR(Arg),sharedLock);
  185.       ELSE
  186.         Dir:=OldDir;
  187.       END;
  188.       IF (Arg[0]="?")AND(DummyL=1)THEN
  189.         IF Out#NIL THEN
  190.           WriteString(ADR('DIR/S,"Q"/S'));
  191.           WriteLn;
  192.         END;
  193.         Usage:=TRUE;
  194.       END;
  195.     END;
  196.     IF (Out#NIL)AND NOT Usage THEN
  197.       DispDir(Dir,0,DummyF,DummyB);
  198.       IF Dir=NIL THEN
  199.         WriteString(ADR("Directory not found"));
  200.         WriteLn;
  201.       END;
  202.       IF ctrlC IN SetSignal(LONGSET{},LONGSET{}) THEN
  203.         WriteString(ADR("*** Break"));
  204.         WriteLn;
  205.       END;
  206.     END;
  207.     DEALLOCATE(Info,SIZE(FileInfoBlock));
  208.     IF wbStarted THEN
  209.       IF WaitForChar(Out,TimeOut)#0 THEN END;
  210.       Close(Out);
  211.     ELSE
  212.       Dir:=CurrentDir(OldDir);
  213.     END;
  214.   END;
  215. END ListAll.
  216.